package engine;

import java.util.*;

import donnees.*;

public class Preferences {
    protected String villeDepart;
    protected String villeArrivee;
    protected TypeTrajet typeTrajet;
    protected int[] vitesseMinMax;
    protected ArrayList<String> villesASuivre;
    protected ArrayList<String> villesAEviter;
    protected Object villesObject; // remplacer villesASuivre et villesAEviter dans classement
    protected ChoixPrefPayant payant;
    protected ChoixPrefRadar radars;
    protected ChoixPrefTourismeTroncon tronconsTouristiques;
    protected ChoixPrefTourismeVille villesTouristiques;
    protected ArrayList<ChoixPrefTypeRoute> typeRouteAEviter;
    protected ArrayList<ChoixPrefTypeVille> typeVilleAEviter;
    protected ArrayList<Object> classement;
    protected int derniereContrainteRelachee;
    
	public Preferences() {
		vitesseMinMax = new int[2];
		villesASuivre = new ArrayList<String>();
		villesAEviter = new ArrayList<String>();
		villesObject = new Object();
		typeRouteAEviter = new ArrayList<ChoixPrefTypeRoute>();
		typeVilleAEviter = new ArrayList<ChoixPrefTypeVille>();
		classement = new ArrayList<Object>();
	}
    public String toString() {
    	String s = "";
    	s+="Trajet ";
    	s+=typeTrajet.toString();
    	s+=" de "+villeDepart+" a "+villeArrivee+"\n";
    	s+="Contraintes :\n";
    	s+="  vitesse min " + vitesseMinMax[0]+"\n";
    	s+="  vitesse max " + vitesseMinMax[1]+"\n";
    	s+="  payant " + payant+"\n";
    	s+="  radars " + radars+"\n";
    	s+="  troncons touristiques " + tronconsTouristiques+"\n";
    	s+="  villes touristiques " + villesTouristiques+"\n";
    	s+="Villes a suivre :\n";
    	if (villesASuivre.size() == 0) {
    		s+="  aucune\n";
    	}
    	for (String v : villesASuivre) {
    		s+="  "+v+"\n";
		}
    	s+="Villes a eviter :\n";
    	if (villesAEviter.size() == 0) {
    		s+="  aucune\n";
    	}
    	for (String v : villesAEviter) {
    		s+="  "+v+"\n";
		}
    	// types de villes a eviter
    	s+="Types villes a eviter :\n";
    	if (typeVilleAEviter.size() == 0) {
    		s+="  aucun\n";
    	}
    	for (ChoixPrefTypeVille typeVille : typeVilleAEviter) {
    		s+="  "+typeVille.getTypeVille().getNom()+"\n";
		}
    	// types de routes a eviter
    	s+="Types routes a eviter :\n";
    	if (typeRouteAEviter.size() == 0) {
    		s+="  aucun\n";
    	}
    	for (ChoixPrefTypeRoute typeRoute : typeRouteAEviter) {
    		s+="  "+typeRoute.getTypeRoute().getNom()+"\n";
		}
    	// classement
    	s+="Classement :\n";
    	if (classement.size() == 0) {
    		s+="  aucun\n";
    	}
    	for (Object o : classement) {
    		s+="  "+o+"\n";
		}
    	return s;
    }
    public void ajouterContraintesDonnees(Donnees d) {
    	// TODO reorganiser en fonction de l'ordre des contraintes (panels)
    	d.reinitialiserContraintes();
    	for (int i = 0; i < derniereContrainteRelachee ; i++) {
    		Object o = classement.get(i);
    		if (o.equals(vitesseMinMax)) {
	        	if (vitesseMinMax[0]!=-1) {
	        		d.acVitesseMin(vitesseMinMax[0]);
	        	}
	        	if (vitesseMinMax[1]!=-1) {
	        		d.acVitesseMax(vitesseMinMax[1]);
	        	}
    		}
    		else if (o.equals(payant)) {
    			payant.ajouterContraintes(d);
    		}
    		else if (o.equals(radars)) {
    			radars.ajouterContraintes(d);
    		}
    		else if (o.equals(tronconsTouristiques)) {
    			tronconsTouristiques.ajouterContraintes(d);
    		}
    		else if (o.equals(villesTouristiques)) {
    			villesTouristiques.ajouterContraintes(d);
    		}
    		else if (o.equals(typeRouteAEviter)) {
	        	for (ChoixPrefTypeRoute type : typeRouteAEviter) {
	    			type.ajouterContraintes(d);
	    		}
    		}
    		else if (o.equals(typeVilleAEviter)) {
	        	for (ChoixPrefTypeVille type : typeVilleAEviter) {
	    			type.ajouterContraintes(d);
	    		}
    		}
    		else if (o.equals(villesObject)) {
	        	for (String s : villesAEviter) {
	    			d.acVilleAEviter(s);
	    		}
    		}
		}
    }
    public void initializeClassement (int n) {
    	for (int i = 0; i < n; i++) {
			classement.add(null);
		}
    }
    public boolean addClassement(Object o, int i) {
    	if (classement.get(i) != null) {
    		return false;
    	}
    	classement.set(i, o);
    	return true;
    }
    public void finalizeClassement() {
    	int i=0;
    	while (i<classement.size()) {
    		Object o = classement.get(i);
			if (o == null) {
				classement.remove(o);
			}
			else {
				i++;
			}
    	}
		derniereContrainteRelachee = classement.size()-1;
    }
    public boolean relacherContrainteSuivante(Donnees d) {  // TODO relacherContrainteSuivante
    	derniereContrainteRelachee--;
    	ajouterContraintesDonnees(d);
    	return derniereContrainteRelachee>=0;
    }
    public TypeTrajet getTypeTrajet() {
        return typeTrajet;
    }
    public void setTypeTrajet(TypeTrajet _typeTrajet) {
        typeTrajet = _typeTrajet;
    }
    public ChoixPrefPayant getPayant() {
        return payant;
    }
    public void setPayant(ChoixPrefPayant _choixPayant) {
        payant = _choixPayant;
    }
    public ChoixPrefRadar getRadars() {
        return radars;
    }
    public void setRadars(ChoixPrefRadar val) {
        radars = val;
    }
    public ChoixPrefTourismeTroncon getTronconsTouristiques() {
        return tronconsTouristiques;
    }
    public void setTronconsTouristiques(ChoixPrefTourismeTroncon val) {
        tronconsTouristiques = val;
    }
    public ChoixPrefTourismeVille getVillesTouristiques() {
        return villesTouristiques;
    }
    public void setVillesTouristiques(ChoixPrefTourismeVille val) {
        villesTouristiques = val;
    }
    public int getPoids(int d, int v){
    	return typeTrajet.getPoids(d,v);
    }
    public ArrayList<ChoixPrefTypeVille> getTypeVilleAEviter () {
    	return typeVilleAEviter;
    }
    public void ajouterTypeVilleAEviter (TypeVille t) {
    	typeVilleAEviter.add(new ChoixPrefTypeVille(t));
    }
    public ArrayList<ChoixPrefTypeRoute> getTypeRouteAEviter () {
    	return typeRouteAEviter;
    }
    public void ajouterTypeRouteAEviter (TypeRoute t) {
    	typeRouteAEviter.add(new ChoixPrefTypeRoute(t));
    }
    public int getVitesseMin() {
        return vitesseMinMax[0];
    }
    public void setVitesseMin(int _vitesseMin) {
        vitesseMinMax[0] = _vitesseMin;
    }
    public int getVitesseMax() {
        return vitesseMinMax[1];
    }
    public void setVitesseMax(int _vitesseMax) {
        vitesseMinMax[1] = _vitesseMax;
    }
    public int[] getVitesseMinMax() {
        return vitesseMinMax;
    }
    public ArrayList<Object> getClassement() {
        return classement;
    }
    public int getDerniereContrainteRelachee() {
        return derniereContrainteRelachee;
    }
    public ArrayList<String> getVillesASuivre() {
        return villesASuivre;
    }
    public void ajouterVilleASuivre (String v) {
    	villesASuivre.add(v);
    }
    public ArrayList<String> getVillesAEviter() {
        return villesAEviter;
    }
    public void ajouterVilleAEviter (String v) {
    	villesAEviter.add(v);
    }
    public Object getVilleObject () {
    	return villesObject;
    }
    public String getVilleDepart() {
        return villeDepart;
    }
    public void setVilleDepart(String _villeDepart) {
        villeDepart = _villeDepart;
    }
    public String getVilleArrivee() {
        return villeArrivee;
    }
    public void setVilleArrivee(String _villeArrivee) {
        villeArrivee = _villeArrivee;
    }
}